home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap16 / ShowDib6 / ShowDib6.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  7.3 KB  |  228 lines

  1. /*------------------------------------------------
  2.    SHOWDIB6.C -- Display DIB with palette indices
  3.                  (c) Charles Petzold, 1998
  4.   ------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "..\\ShowDib3\\PackeDib.h"
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("ShowDib6") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HWND     hwnd ;
  18.      MSG      msg ;
  19.      WNDCLASS wndclass ;
  20.  
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.      wndclass.lpfnWndProc   = WndProc ;
  23.      wndclass.cbClsExtra    = 0 ;
  24.      wndclass.cbWndExtra    = 0 ;
  25.      wndclass.hInstance     = hInstance ;
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  29.      wndclass.lpszMenuName  = szAppName ;
  30.      wndclass.lpszClassName = szAppName ;
  31.  
  32.      if (!RegisterClass (&wndclass))
  33.      {
  34.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  35.                       szAppName, MB_ICONERROR) ;
  36.           return 0 ;
  37.      }
  38.  
  39.      hwnd = CreateWindow (szAppName, TEXT ("Show DIB #6: Palette Indices"),
  40.                           WS_OVERLAPPEDWINDOW,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, iCmdShow) ;
  46.      UpdateWindow (hwnd) ;
  47.  
  48.      while (GetMessage (&msg, NULL, 0, 0))
  49.      {
  50.           TranslateMessage (&msg) ;
  51.           DispatchMessage (&msg) ;
  52.      }
  53.      return msg.wParam ;
  54. }
  55.  
  56. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  57. {
  58.      static BITMAPINFO * pPackedDib ;
  59.      static HPALETTE     hPalette ;
  60.      static int          cxClient, cyClient ;
  61.      static OPENFILENAME ofn ;
  62.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  63.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  64.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  65.      HDC                 hdc ;
  66.      int                 i, iNumColors ;
  67.      PAINTSTRUCT         ps ;
  68.      WORD              * pwIndex ;
  69.  
  70.      switch (message)
  71.      {
  72.      case WM_CREATE:
  73.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  74.           ofn.hwndOwner         = hwnd ;
  75.           ofn.hInstance         = NULL ;
  76.           ofn.lpstrFilter       = szFilter ;
  77.           ofn.lpstrCustomFilter = NULL ;
  78.           ofn.nMaxCustFilter    = 0 ;
  79.           ofn.nFilterIndex      = 0 ;
  80.           ofn.lpstrFile         = szFileName ;
  81.           ofn.nMaxFile          = MAX_PATH ;
  82.           ofn.lpstrFileTitle    = szTitleName ;
  83.           ofn.nMaxFileTitle     = MAX_PATH ;
  84.           ofn.lpstrInitialDir   = NULL ;
  85.           ofn.lpstrTitle        = NULL ;
  86.           ofn.Flags             = 0 ;
  87.           ofn.nFileOffset       = 0 ;
  88.           ofn.nFileExtension    = 0 ;
  89.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  90.           ofn.lCustData         = 0 ;
  91.           ofn.lpfnHook          = NULL ;
  92.           ofn.lpTemplateName    = NULL ;
  93.  
  94.           return 0 ;
  95.  
  96.      case WM_SIZE:
  97.           cxClient = LOWORD (lParam) ;
  98.           cyClient = HIWORD (lParam) ;
  99.           return 0 ;
  100.  
  101.      case WM_COMMAND:
  102.           switch (LOWORD (wParam))
  103.           {
  104.           case IDM_FILE_OPEN:
  105.  
  106.                     // Show the File Open dialog box
  107.  
  108.                if (!GetOpenFileName (&ofn))
  109.                     return 0 ;
  110.                
  111.                     // If there's an existing packed DIB, free the memory
  112.  
  113.                if (pPackedDib)
  114.                {
  115.                     free (pPackedDib) ;
  116.                     pPackedDib = NULL ;
  117.                }
  118.                
  119.                     // If there's an existing logical palette, delete it
  120.  
  121.                if (hPalette)
  122.                {
  123.                     DeleteObject (hPalette) ;
  124.                     hPalette = NULL ;
  125.                }
  126.                
  127.                     // Load the packed DIB into memory
  128.  
  129.                SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  130.                ShowCursor (TRUE) ;
  131.  
  132.                pPackedDib = PackedDibLoad (szFileName) ;
  133.  
  134.                ShowCursor (FALSE) ;
  135.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  136.  
  137.                if (pPackedDib)
  138.                {
  139.                          // Create the palette from the DIB color table
  140.  
  141.                     hPalette = PackedDibCreatePalette (pPackedDib) ;
  142.  
  143.                          // Replace DIB color table with indices
  144.  
  145.                     if (hPalette)
  146.                     {
  147.                          iNumColors = PackedDibGetNumColors (pPackedDib) ;
  148.                          pwIndex = (WORD *) 
  149.                                         PackedDibGetColorTablePtr (pPackedDib) ;
  150.  
  151.                          for (i = 0 ; i < iNumColors ; i++)
  152.                               pwIndex[i] = (WORD) i ;
  153.                     }
  154.                }
  155.                else
  156.                {
  157.                     MessageBox (hwnd, TEXT ("Cannot load DIB file"), 
  158.                                 szAppName, 0) ;
  159.                }
  160.                InvalidateRect (hwnd, NULL, TRUE) ;
  161.                return 0 ;
  162.           }
  163.           break ;
  164.  
  165.      case WM_PAINT:
  166.           hdc = BeginPaint (hwnd, &ps) ;
  167.  
  168.           if (hPalette)
  169.           {
  170.                SelectPalette (hdc, hPalette, FALSE) ;
  171.                RealizePalette (hdc) ;
  172.           }
  173.           
  174.           if (pPackedDib)
  175.                SetDIBitsToDevice (hdc, 
  176.                                   0,   
  177.                                   0,   
  178.                                   PackedDibGetWidth (pPackedDib), 
  179.                                   PackedDibGetHeight (pPackedDib),
  180.                                   0,                            
  181.                                   0,                            
  182.                                   0,                            
  183.                                   PackedDibGetHeight (pPackedDib),  
  184.                                   PackedDibGetBitsPtr (pPackedDib), 
  185.                                   pPackedDib, 
  186.                                   DIB_PAL_COLORS) ;
  187.           EndPaint (hwnd, &ps) ;
  188.           return 0 ;
  189.  
  190.      case WM_QUERYNEWPALETTE:
  191.           if (!hPalette)
  192.                return FALSE ;
  193.  
  194.           hdc = GetDC (hwnd) ;
  195.           SelectPalette (hdc, hPalette, FALSE) ;
  196.           RealizePalette (hdc) ;
  197.           InvalidateRect (hwnd, NULL, TRUE) ;
  198.  
  199.           ReleaseDC (hwnd, hdc) ;
  200.           return TRUE ;
  201.  
  202.      case WM_PALETTECHANGED:
  203.           if (!hPalette || (HWND) wParam == hwnd)
  204.                break ;
  205.  
  206.           hdc = GetDC (hwnd) ;
  207.           SelectPalette (hdc, hPalette, FALSE) ;
  208.           RealizePalette (hdc) ;
  209.           UpdateColors (hdc) ;
  210.  
  211.           ReleaseDC (hwnd, hdc) ;
  212.           break ;
  213.  
  214.           
  215.      case WM_DESTROY:
  216.           if (pPackedDib)
  217.                free (pPackedDib) ;
  218.  
  219.           if (hPalette)
  220.                DeleteObject (hPalette) ;
  221.  
  222.           PostQuitMessage (0) ;
  223.           return 0 ;
  224.      }
  225.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  226. }
  227.  
  228.